社论 22.10.15 排列逆序对计数
之前对着第二维就是求和生成然后什么玩意都搞不出来 wssb
给定 ,求长度为 、逆序对数为 的排列数量模 后的值。
。
考虑令 为长度为 ,逆序对数为 的排列的数量。答案即为 。
考虑通过插入计数。
我们首先有一个长度为 ,逆序对数为 的排列。现在向其中插入元素 。容易发现其插入在从前往后数的第 位置会导致其后面的 个元素和它生成逆序对,因此 能贡献给 。
重写一下,我们有 式:
然后能做到 的复杂度。
我们发现后面的部分其实是一个前缀和差分的形式,因此维护一下前缀和能做到 的复杂度。
O(nk log n)
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define rep(i,a,b) for (register int i = (a), i##_ = (b) + 1; i < i##_; ++i)
#define pre(i,a,b) for (register int i = (a), i##_ = (b) - 1; i > i##_; --i)
int n, m, x;
struct BIT {
int Index[3005];
int operator [] (int p) {
int ret = 0;
while (p) {
ret += Index[p];
p ^= p & -p;
} return ret;
}
void add(int p, int v) {
while (p <= n) {
Index[p] += v;
p += p & -p;
}
}
} f[3005];
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
f[1].add(1, 1);
rep(i,2,n) {
rep(j,0,min((i * (i-1)) >> 1, n)) {
f[i].add(j + 1, (f[i-1][j + 1] - f[i-1][j - min(i-1,j)]));
}
} rep(i,1,m) {
cin >> x; x ++;
cout << (f[n][x] - f[n][x-1]) << '\n';
}
}
[能不能再给力一点啊?]
题面相同。
认为 同阶,因此下文中渐进式内只使用 。
考虑对第二维求和得到生成函数
则答案即为 。
我们考虑转移方程。我们发现, 位置能够从 转移过来。放在生成函数上, 可以通过 转移过来。
于是有
考虑 和 的求法。
是五边形数。有关五边形数:
五边形数定理
设 为欧拉函数的生成函数。有下式:
我们发现 的幂级数形式只有 项有值。直接生成即可。这部分的复杂度为 。
可以直接通过多项式快速幂在 的复杂度内生成。
生成后直接做多项式卷积即可。复杂度 。
[能不能再给力一点啊?]
题面相同。
。
注意到在上文中我们只需要多项式中第 次项。因此直接从 位置截断即可得到最终答案。
随后我们可以在 的时间内生成 。
随后我们可以使用多项式快速幂得到 。
时间复杂度为 。
使用生成函数方式证明 的行取值对称。
于是有
于是有
由于 有意义的取值部分位于 部分,因此我们证明了 的取值的对称性。
关于“能不能再给力一点啊?”这件事,由于我多项式远处系数提取的功底不够扎实,先咕着。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/editorial221015.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)